package visual;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SpringLayout;
import model.Ciudad;
import model.FechaHora;
import model.Juego;
import model.Novato;
import model.ObjetoRobado;
import model.Rango;
import model.Sospechoso;

public class InterfazPrincipal extends JFrame{
	
	private static final long serialVersionUID = 1L;
	JPanel panelSup;
	JMenuBar menuBar;
	JLabel horasDelCaso;
	JLabel rango;
	JLabel dia;
	JLabel hora;
	JLabel ciudad;
	JLabel arrestos;
	
	JTextField tHorasDelCaso;
	JTextField tRango;
	JTextField tDia;
	JTextField tHora;
	JTextField tCiudad;
	JTextField tArrestos;
	
	JButton viajar;
	JButton	pistas;
	JButton orden;
	
	Icon iViajar = new ImageIcon(getClass().getResource("viajar.png"));
	Icon iPistas = new ImageIcon(getClass().getResource("pistas.png"));
	Icon iOrden = new ImageIcon(getClass().getResource("orden.png"));
	
	Juego juego;
	Ciudades ciudadesGrafica;
	Lugares lugares;
	Descripciones descripciones;
	ArrayList<Ciudad> ciudades;
	ArrayList<Sospechoso> sospechosos;
	ArrayList<ObjetoRobado> comunes;
	ArrayList<ObjetoRobado> valiosos;
	ArrayList<ObjetoRobado> muyValiosos;
	
	FechaHora fIni; 
	FechaHora fFin;
	
	boolean CondicionDelJuego = false;
	
	public InterfazPrincipal(final FechaHora fInicial, final FechaHora fFinal, Rango unRango, final ArrayList<Ciudad> ciudades, final ArrayList<Sospechoso> sospechosos, final ArrayList<ObjetoRobado> comunes, final ArrayList<ObjetoRobado> valiosos, final ArrayList<ObjetoRobado> muyValiosos){
		
		super("Algo Thief 3");
		this.fIni = new FechaHora(fInicial.obtenerDia(), fInicial.obtenerHora());
		this.fFin = fFinal;
		this.ciudades = ciudades;
		this.sospechosos = sospechosos;
		this.comunes = comunes;
		this.valiosos = valiosos;
		this.muyValiosos = muyValiosos;
				
		this.juego = new Juego(fInicial, fFinal, unRango, ciudades, sospechosos, comunes, valiosos, muyValiosos);
		setBounds( 700, 200, 415, 300);
		SpringLayout layout = new SpringLayout();
		panelSup = new JPanel(layout);
		lugares = new Lugares(juego, this);
		descripciones = new Descripciones(juego, this);
		ciudadesGrafica = new Ciudades(juego,this);
		
		horasDelCaso = new JLabel("Horas del caso: ");
		layout.putConstraint(SpringLayout.WEST, horasDelCaso, 5, SpringLayout.WEST, panelSup);
		layout.putConstraint(SpringLayout.NORTH, horasDelCaso, 5,  SpringLayout.NORTH, panelSup);
		tHorasDelCaso = new JTextField(String.format("%s",juego.obtenerTiempoDelCaso()));
		tHorasDelCaso.setEditable(false);
		layout.putConstraint(SpringLayout.WEST, tHorasDelCaso, 5, SpringLayout.EAST, horasDelCaso);
		layout.putConstraint(SpringLayout.NORTH, tHorasDelCaso, 5,  SpringLayout.NORTH, panelSup);
		
		rango = new JLabel("Grado de policia: ");
		layout.putConstraint(SpringLayout.WEST, rango, 5, SpringLayout.WEST, panelSup);
		layout.putConstraint(SpringLayout.NORTH, rango, 15,  SpringLayout.SOUTH, horasDelCaso);
		tRango = new JTextField(String.format("%s",juego.obtenerRango()), 6);
		tRango.setEditable(false); 
		layout.putConstraint(SpringLayout.WEST, tRango, 5, SpringLayout.EAST, rango);
		layout.putConstraint(SpringLayout.NORTH, tRango, 15,  SpringLayout.SOUTH, horasDelCaso);
	
		ciudad = new JLabel("Ciudad: ");
		layout.putConstraint(SpringLayout.WEST, ciudad, 5, SpringLayout.WEST, panelSup);
		layout.putConstraint(SpringLayout.NORTH, ciudad, 15,  SpringLayout.SOUTH, rango);
		tCiudad = new JTextField(juego.obtenerJugador().obtenerCiudadActual().obtenerNombre(), 6);
		tCiudad.setEditable(false);
		layout.putConstraint(SpringLayout.WEST, tCiudad, 5, SpringLayout.EAST, ciudad);
		layout.putConstraint(SpringLayout.NORTH, tCiudad, 15,  SpringLayout.SOUTH, rango);
		
		dia = new JLabel("Dia: ");
		layout.putConstraint(SpringLayout.WEST, dia, 5, SpringLayout.WEST, panelSup);
		layout.putConstraint(SpringLayout.NORTH, dia, 15,  SpringLayout.SOUTH, ciudad);
		tDia = new JTextField(juego.obtenerFecha().obtenerDia().toString(), 7);
		tDia.setEditable(false);
		layout.putConstraint(SpringLayout.WEST, tDia, 5, SpringLayout.EAST, dia);
		layout.putConstraint(SpringLayout.NORTH, tDia, 15,  SpringLayout.SOUTH, ciudad);
		
		hora = new JLabel("Hora: ");
		layout.putConstraint(SpringLayout.WEST, hora, 5, SpringLayout.WEST, panelSup);
		layout.putConstraint(SpringLayout.NORTH, hora, 15,  SpringLayout.SOUTH, dia);
		tHora = new JTextField(String.format("%s",juego.obtenerFecha().obtenerHora()), 2);
		tHora.setEditable(false);
		layout.putConstraint(SpringLayout.WEST, tHora, 5, SpringLayout.EAST, hora);
		layout.putConstraint(SpringLayout.NORTH, tHora, 15,  SpringLayout.SOUTH, dia);
		
		arrestos = new JLabel("Arrestos: ");
		layout.putConstraint(SpringLayout.WEST, arrestos, 235, SpringLayout.EAST, tHora);
		layout.putConstraint(SpringLayout.NORTH, arrestos, 15,  SpringLayout.SOUTH, dia);
		tArrestos = new JTextField(String.format("%s", juego.obtenerJefatura().obtenerCantidadDeArrestos()));
		tArrestos.setEditable(false);
		layout.putConstraint(SpringLayout.WEST, tArrestos, 5, SpringLayout.EAST, arrestos);
		layout.putConstraint(SpringLayout.NORTH, tArrestos, 15,  SpringLayout.SOUTH, dia);
		
//handler		
		Handler handler = new Handler();
		viajar = new JButton("VIAJAR", iViajar);
		viajar.addActionListener(handler);
		layout.putConstraint(SpringLayout.WEST, viajar, 20, SpringLayout.WEST, panelSup);
		layout.putConstraint(SpringLayout.SOUTH, viajar, -40,  SpringLayout.SOUTH, panelSup);
		
		pistas = new JButton("PISTAS", iPistas);
		pistas.addActionListener(handler);
		layout.putConstraint(SpringLayout.WEST, pistas, 10, SpringLayout.EAST, viajar);
		layout.putConstraint(SpringLayout.SOUTH, pistas, -40,  SpringLayout.SOUTH, panelSup);
		
		orden = new JButton("ORDEN", iOrden);
		orden.addActionListener(handler);
		layout.putConstraint(SpringLayout.WEST, orden, 10, SpringLayout.EAST, pistas);
		layout.putConstraint(SpringLayout.SOUTH, orden, -40,  SpringLayout.SOUTH, panelSup);
//Menu
		menuBar = new JMenuBar();
		JMenu game = new JMenu("Game");
		JMenuItem reset = new JMenuItem("Resetear");
		game.add(reset);
		game.addSeparator();
		reset.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				FechaHora fh = new FechaHora(fIni.obtenerDia(), fIni.obtenerHora());
				juego = new Juego(fh, fFinal, new Novato(), ciudades, sospechosos, comunes, valiosos, muyValiosos);
				actualizarVentanas(juego);
				actualizarInterfaz();
				JOptionPane.showMessageDialog(null, "Juego nuevo.");
			}
								}
		);
		JMenuItem exit = new JMenuItem("Terminar");
		game.add(exit);
		exit.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				termino();
				System.exit(-1);
			}
								}
		);
		JMenu about = new JMenu("About");
		JMenuItem acerca = new JMenuItem("Acerca de ..");
		about.add(acerca);
		acerca.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent event){
				JOptionPane.showMessageDialog(null, String.format("%s\n%s%s%s\n", "Algo Thief 3 created by:","\nChristian Reyes ", "\nKevin Gonzalez", "\nJose Rodriguez"));
			}
								}
		);
	
		menuBar.add(game);
		menuBar.add(about);
		setJMenuBar(menuBar);
		panelSup.add(viajar);
		panelSup.add(pistas);
		panelSup.add(orden);
		panelSup.add(horasDelCaso);
		panelSup.add(tHorasDelCaso);
		panelSup.add(rango);
		panelSup.add(tRango);
		panelSup.add(dia);
		panelSup.add(tDia);
		panelSup.add(hora);
		panelSup.add(tHora);
		panelSup.add(ciudad);
		panelSup.add(tCiudad);
		panelSup.add(arrestos);
		panelSup.add(tArrestos);
		add(panelSup);
		setVisible(true);
	}

		private class Handler implements ActionListener {
		
			public void actionPerformed(ActionEvent event){
					
				if(event.getSource()== viajar){
				
					ciudadesGrafica.setVisible(true);
					ciudadesGrafica.actualizarCiudades();
				}
				else{ if(event.getSource()== pistas){
					
					lugares.actualizarLugares();
					lugares.setVisible(true);
			
					}
					else{ if(event.getSource()== orden){
				   			descripciones.setVisible(true);
				   			
				  		   }
					}
					
				}
			}
		}
		
	public void actualizarVentanas(Juego juego){
		lugares = new Lugares(juego, this);
		descripciones = new Descripciones(juego, this);
		ciudadesGrafica= new Ciudades (juego,this);
	}
	
	public ArrayList<Ciudad> getCiudadesMundo(){
		   return this.ciudades;
		  }
	
	public void actualizarInterfaz(){
		tHorasDelCaso.setText(String.format("%s", juego.obtenerTiempoDelCaso()));
		if(juego.obtenerTiempoDelCaso()<= 0){
			JOptionPane.showMessageDialog(null, "Te quedaste sin tiempo.");
			this.lugares.opcionContinuar();
		}
		tRango.setText(juego.obtenerRango().toString());
		tDia.setText(juego.obtenerFecha().obtenerDia().toString());
		tHora.setText(String.format("%s",juego.obtenerFecha().obtenerHora()));
		tCiudad.setText(juego.obtenerJugador().obtenerCiudadActual().obtenerNombre());
		tArrestos.setText(String.format("%s", juego.obtenerJefatura().obtenerCantidadDeArrestos()));
	}

	public void terminar(){
		this.CondicionDelJuego = true;
	}
	
	public boolean termino(){
		return this.CondicionDelJuego;
	}
}